/*
 * Copyright 2001, 2002,2004 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.xerces.impl.dv.xs;

import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
import org.apache.xerces.impl.dv.ValidationContext;
import org.apache.xerces.impl.dv.util.Base64;

/**
 * Represent the schema type "base64Binary"
 *
 * @xerces.internal 
 *
 * @author Neeraj Bajaj, Sun Microsystems, inc.
 * @author Sandy Gao, IBM
 *
 * @version $Id: Base64BinaryDV.java,v 1.7 2004/10/06 14:56:47 mrglavas Exp $
 */
public class Base64BinaryDV extends TypeValidator {

    public short getAllowedFacets(){
        return ( XSSimpleTypeDecl.FACET_MINLENGTH | XSSimpleTypeDecl.FACET_PATTERN | XSSimpleTypeDecl.FACET_WHITESPACE );
    }

    public Object getActualValue(String content, ValidationContext context) throws InvalidDatatypeValueException {
        byte[] decoded = Base64.decode(content);
        if (decoded == null)
            throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new Object[]{content, "base64Binary"});

        return  decoded;
    }

    // length of a binary type is the number of bytes
//    public int getDataLength(Object value) {
//        return ((XBase64)value).getLength();
//    }

    /**
     * represent base64 data
     */
//    private static final class XBase64 extends ByteListImpl {
//
//        public XBase64(byte[] data) {
//            super(data);
//        }
//        public synchronized String toString() {
//            if (canonical == null) {
//                canonical = Base64.encode(data);
//            }
//            return canonical;
//        }
//        
//        public boolean equals(Object obj) {
//            if (!(obj instanceof XBase64))
//                return false;
//            byte[] odata = ((XBase64)obj).data;
//            int len = data.length;
//            if (len != odata.length)
//                return false;
//            for (int i = 0; i < len; i++) {
//                if (data[i] != odata[i])
//                    return false;
//            }
//            return true;
//        }
//    }
} // class Base64BinaryDV
